package router

import (
	"os"
	"path/filepath"

	"github.com/gin-gonic/gin"
	"go-api-template/api/middleware"
	"go-api-template/api/router/base"
	v1 "go-api-template/api/router/v1"
	"go-api-template/service"
	"golang.org/x/time/rate"
)

func Init() *gin.Engine {
	r := gin.Default()

	limiter := rate.NewLimiter(service.Conf.Limit.RateLimit, service.Conf.Limit.RateTotal)

	// 引用全局中间件
	r.Use(
		// middleware.UserLoginMid(),
		middleware.BaseMid(), // 基础
		middleware.CorsMid(), // 跨域
		// middleware.Recover,   // 异常
	)

	if service.Conf.Limit.Enable {
		service.Log.Info("限流策略已开启")
		r.Use(middleware.CurrentLimitMid(limiter))
	}

	r.Use(staticServe("/", service.Conf.App.UseTemplate))

	// 设置默认路由前缀
	rg := r.Group("/api")

	// 设备版本路由
	v1.SetRouter(rg)

	// 系统路由
	base.SetRouter(rg)

	return r
}

func staticServe(urlPrefix, root string) gin.HandlerFunc {
	return func(c *gin.Context) {
		// 检查请求是否为 GET 请求
		if c.Request.Method != "GET" {
			return
		}

		// 检查请求是否应该被 API 路由处理
		if isAPIPath(c.Request.URL.Path) {
			return
		}

		// 尝试找到并服务请求的文件
		path := filepath.Join(root, c.Request.URL.Path)
		_, err := os.Stat(path)
		if err == nil {
			c.File(path)
			return
		}

		// 如果文件不存在，且不是 API 路由，返回 index.html
		c.File(filepath.Join(root, "index.html"))
	}
}

func isAPIPath(path string) bool {
	// 处理特定API路径，避免拦截API请求
	return len(path) > 4 && path[:5] == "/api/"
}
